package com.ocean.web.task;

import com.ocean.common.utils.JYFTPProperties;
import com.ocean.system.domain.OFileMetadata;
import com.ocean.system.domain.OFileMetadataLog;
import com.ocean.system.domain.OFileMetadataRw;
import com.ocean.system.domain.SeaTempNcMetadata;
import com.ocean.system.service.IOFileMetadataLogService;
import com.ocean.system.service.IOFileMetadataRwService;
import com.ocean.system.service.IOFileMetadataService;
import com.ocean.system.service.ISysConfigService;
import com.ocean.web.util.CpjypgSST;
import com.ocean.web.util.CpjypgSWT;

import com.ocean.web.util.FileDirUtils;
import com.ocean.web.util.file.FileNameExtractor;
import com.ocean.web.util.ftpuputil.FtpLargeFileUploader;
import com.ocean.web.util.rwdata.GlobalXBTSstNcReader_5_4_1;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ucar.ma2.InvalidRangeException;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;


/**
 * 产品评估检验处理西北太海温
 */
@Component("SWTCppgjyTask")
@Slf4j
public class SWTCppgjyTask {
    @Autowired
    private ISysConfigService configService;
    @Autowired
    private IOFileMetadataService ioFileMetadataService;
    @Autowired
    private IOFileMetadataRwService ioFileMetadataRwService;
    @Autowired
    IOFileMetadataLogService ioFileMetadataLogService;

    public void processCppgjyData() {
        log.info("处理SWT数据");
/*        // 原文件路径和新文件路径（替换为实际路径）
        String inputPath = "E:\\项目资料备份\\新云平台文件\\2025工作\\样例数据-检验\\全球海温\\NMF_BEN_GO_GLDT_2025090900_168h_SST.nc";
        String outputPath = "E:\\NMF_BEN_GO_GLDT_2025090900_168h_SST_cropped.nc";
        CJNcdatazgjh(inputPath,outputPath);*/

    }
    public void SWTqqhw() throws InvalidRangeException, IOException, ParseException {
        String folderPath = configService.selectConfigByKey("xbthw");//获取全球海温地址
        //String folderPath = "E:\\项目资料备份\\新云平台文件\\2025工作\\样例数据-检验\\全球海温\\";
        String outPath = "E:\\nc\\SWT\\";
        FileDirUtils.createDirIfNotExists(outPath);//创建文件夹
        // 获取当天日期（yyyyMMdd）
        TimeZone timeZone = TimeZone.getTimeZone("GMT+8"); // 或 TimeZone.getTimeZone("GMT+8")
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        sdf.setTimeZone(timeZone); // 绑定时区
        String today = sdf.format(new Date());

        // 调整正则表达式：核心匹配“当天日期+小时”部分，后面的时效部分放宽限制
        // 格式说明：
        // - 必须包含 "CMA_BEN_GRAPESGFS_GLDT_" + 当天日期（yyyyMMdd）+ 小时（1-2位数字）
        // - 中间用下划线分隔，时效部分为数字+h，最后是 .nc 后缀
        String regex = "NMF_BEN_OSMTSCB_NWPACDT_" + today + "\\d{1,2}_\\d+h_SWT\\.nc";
        String LY = "国家海洋环境预报中心";

        File folder = new File(folderPath);
        if (!folder.exists() || !folder.isDirectory()) {
            System.out.println("错误：文件夹不存在或不是有效目录 -> " + folderPath);
            return;
        }

        File[] files = folder.listFiles();
        boolean found = false;
        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    String fileName = file.getName();
                    if (fileName.matches(regex)) {
                        //==============检查文件是否已存在==============
                        OFileMetadata oFileMetadata1 = new OFileMetadata();
                        oFileMetadata1.setNcname(fileName);//文件名
                        List<OFileMetadata> oFileMetadata2 = ioFileMetadataService.selectOFileMetadataList(oFileMetadata1);
                        if(oFileMetadata2.size()>0){
                            System.out.println("跳过，文件已存在："+fileName);
                            continue;
                        }
                        String inputPath = folderPath+fileName;
                        String outputPath = outPath+fileName.replace("SWT","SWT_cropped");
                        boolean b = CpjypgSWT.cropNcFileByOffshoreRange(inputPath, outputPath);
                        System.out.println("找到该文件：" + fileName);
                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        //8.读取文件里的信息存入数据库任务
                        GlobalXBTSstNcReader_5_4_1 reader = new GlobalXBTSstNcReader_5_4_1();
                        // 读取元数据，返回SeaTempNcMetadata实体
                        SeaTempNcMetadata metadata = reader.readNwPacificMetadata(inputPath);
                        OFileMetadata oFileMetadata = new OFileMetadata();
                        oFileMetadata.setNcname(metadata.getNcFileName());//文件名
                        oFileMetadata.setLy(LY);//来源ncParam.getSource()
                        oFileMetadata.setLx(metadata.getType());//类型
                        LocalDateTime localDateTime = LocalDateTime.parse(metadata.getForecastBaseTime(), formatter);
                        Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
                        oFileMetadata.setQbsj(sdf.parse(today));//基准时间
                        oFileMetadata.setYbsj(metadata.getForecastLeadTime());//时效
                        oFileMetadata.setYbpc(metadata.getForecastFreq());//时效单位
                        oFileMetadata.setFgfw(metadata.getCoverage());//覆盖范围
                        oFileMetadata.setKjfbl(metadata.getSpatialRes());//空间分辨率
                        oFileMetadata.setYbys(metadata.getElements().toString());//变量
                        if(b == true){
                            LocalDateTime now = LocalDateTime.now();
                            DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                            String formattedDateTime = now.format(formatter1);
                            oFileMetadata.setRksj(formattedDateTime);//注册时间
                            oFileMetadata.setRkzt("2");//注册状态（0：失败，1：成功 ,2：处理中）
                            oFileMetadata.setYbsjwz(inputPath);//文件位置
                            ioFileMetadataService.insertOFileMetadata(oFileMetadata);

                            //将解析好的文件推送到外网往内网推送的服务器中
                            // 执行上传
                            String defaultRemoteFileName = FileNameExtractor.extractFileName(outputPath);
                            System.out.println(JYFTPProperties.FTP_IP+JYFTPProperties.FTP_PORT+JYFTPProperties.FTP_USERNAME+JYFTPProperties.FTP_PASSWORD+JYFTPProperties.FTP_REMOTE_PATH+defaultRemoteFileName);

                            FtpLargeFileUploader.UploadResult status = FtpLargeFileUploader.submitUploadTaskSync(
                                    JYFTPProperties.FTP_IP, JYFTPProperties.FTP_PORT,
                                    JYFTPProperties.FTP_USERNAME, JYFTPProperties.FTP_PASSWORD,
                                    outputPath, JYFTPProperties.FTP_REMOTE_PATH + "/SWT/" + today, defaultRemoteFileName,
                                    false,
                                    // 3. 可选：进度监听器（实时打印上传进度）
                                    (uploadedSize, totalSize, progress) -> {
                                        long uploadedMB = uploadedSize / (1024 * 1024);
                                        long totalMB = totalSize / (1024 * 1024);
                                        System.out.printf("[FTP上传进度] 已传：%dMB / 总：%dMB | 进度：%.2f%%%n",
                                                uploadedMB, totalMB, progress);
                                    },
                                    1,                  // 超时时间（数字）
                                    TimeUnit.HOURS      // 超时单位（HOURS/Minutes/SECONDS）
                            );
                            //查看多少个元素，每个元素添加一条任务
                            String[] split = metadata.getElements().split(";");
                            if (status.getStatus() == FtpLargeFileUploader.UploadStatus.SUCCESS) {
                                System.out.println("文件上传成功！");
                                //查看多少个元素，每个元素添加一条任务
                                // String[] split = ncParam.getElementsStr().split("、");
                                String logrwbm = "";
                                for (int i = 0; i < split.length; i++) {
                                    OFileMetadataRw oFileMetadataRw = new OFileMetadataRw();
                                    long timestampSec = Instant.now().toEpochMilli();
                                    oFileMetadataRw.setRwbm("RW_"+timestampSec);//时间戳
                                    oFileMetadataRw.setYs(split[i]);//变量
                                    oFileMetadataRw.setFmId(oFileMetadata.getId());//元数据id
                                    oFileMetadataRw.setCjsj(new Date());//注册时间
                                    oFileMetadataRw.setRwzt("0");//注册状态（0最新状态，正在执行 是：1完成解析,2执行失败）
                                    oFileMetadataRw.setGxsj(formattedDateTime);//状态更新时间
                                    ioFileMetadataRwService.insertOFileMetadataRw(oFileMetadataRw);
                                    logrwbm += "RW_"+timestampSec + "、";
                                }

                                oFileMetadata.setRkzt("1");//注册状态（0：失败，1：成功 ,2：处理中）
                                ioFileMetadataService.updateOFileMetadata(oFileMetadata);//更新元数据注册状态
                                logrwbm = logrwbm.substring(0, logrwbm.length() - 1);

                                Log(String.valueOf(oFileMetadata.getId()),logrwbm,"新增元数据："+metadata.getNcFileName()+"元素："+metadata.getElements().toString()+",覆盖范围："+metadata.getCoverage()+",空间分辨率："+metadata.getSpatialRes()+"-----"+status.getStatus());
                                System.out.println("找到该文件：" + fileName);
                            } else if(status.getStatus() == FtpLargeFileUploader.UploadStatus.FILE_ALREADY_EXISTS){
                                /*oFileMetadata.setRksj(localDateTime.format(formatter));//注册时间
                                oFileMetadata.setRkzt("0");///注册状态（0：失败，1：成功）
                                oFileMetadata.setYbsjwz(inputPath);//文件位置
                                ioFileMetadataService.insertOFileMetadata(oFileMetadata);*/
                                Log(String.valueOf(oFileMetadata.getId()),"未产生任务-空","原文件id"+oFileMetadata.getId()+"--"+status.getStatus());
                                System.out.println("文件上传失败！文件已存在，无需重复上传");
                            }else if (status.getStatus() == FtpLargeFileUploader.UploadStatus.FTP_CONNECT_FAILED){
                                Log(String.valueOf(oFileMetadata.getId()),"未产生任务-空","原文件id"+oFileMetadata.getId()+"--"+status.getStatus());
                                System.out.println("文件上传失败！FTP 连接失败");
                            }else if (status.getStatus() == FtpLargeFileUploader.UploadStatus.FTP_LOGIN_FAILED){
                                Log(String.valueOf(oFileMetadata.getId()),"未产生任务-空","原文件id"+oFileMetadata.getId()+"--"+status.getStatus());
                                System.out.println("文件上传失败！FTP 登录失败");
                            }else if (status.getStatus() == FtpLargeFileUploader.UploadStatus.FTP_DIRECTORY_CREATE_FAILED){
                                Log(String.valueOf(oFileMetadata.getId()),"未产生任务-空","原文件id"+oFileMetadata.getId()+"--"+status.getStatus());
                                System.out.println("文件上传失败！FTP 目录创建失败");
                            }else if (status.getStatus() == FtpLargeFileUploader.UploadStatus.SERVER_TIMEOUT){
                                Log(String.valueOf(oFileMetadata.getId()),"未产生任务-空","原文件id"+oFileMetadata.getId()+"--"+status.getStatus());
                                System.out.println("文件上传失败！服务器确认超时（文件可能已上传成功）");
                            }

                        }else {
                            oFileMetadata.setRksj(localDateTime.format(formatter));//注册时间
                            oFileMetadata.setRkzt("0");///注册状态（0：失败，1：成功）
                            oFileMetadata.setYbsjwz(inputPath);//文件位置
                            ioFileMetadataService.insertOFileMetadata(oFileMetadata);
                            Log(String.valueOf(oFileMetadata.getId()),"空","该文件裁剪失败");
                            System.out.println("该文件裁剪失败：" + fileName);
                        }
                        System.out.println("找到该文件：" + fileName);
                        found = true;
                    }
                }
            }
        }

        if (!found) {
            System.out.println("未找到当天（" + today + "）符合格式的文件");
        }
    }
    public void Log(String yid,String logrwbm,String status){
        OFileMetadataLog oFileMetadataLog = new OFileMetadataLog();
        oFileMetadataLog.setRwId(logrwbm);
        oFileMetadataLog.setFmId(yid);//元数据id
        oFileMetadataLog.setSj(new Date());//时间
        oFileMetadataLog.setZt(status);//执行状态(内容)//"新增元数据："+ncParam.getNcFileName()+"元素："+ncParam.getElements().toString()+",覆盖范围："+ncParam.getCoverage()+",空间分辨率："+ncParam.getSpatialRes()+"-----"+status
        ioFileMetadataLogService.insertOFileMetadataLog(oFileMetadataLog);//新增元数据日志
    }
 /*   public static void main(String[] args) {
        SSTqqhw();
    }*/
}
